package hr.ctg.domain.action.mjesto;

import hr.ctg.domain.model.Mjesto;
import hr.ctg.domain.model.Rola.Role;
import hr.ctg.service.dao.MjestoDAO;
import hr.web.jsf.model.PagedListDataModel;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.faces.model.SelectItem;

import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Identity;

@Name("mjestoSearchAction")
public class MjestoSearchAction {
	@In
	MjestoDAO mjestoDAO;
	@In
	Identity identity;
	@In
	String currentLang;

	@Logger
	Log log;

	@RequestParameter
	private String letter;
	@RequestParameter
	private Integer page;

	@Factory("firstMjestaLetters")
	public List<String> getFirstLetters() {
		if (identity.hasRole(Role.ADMIN.toString())) {
			return mjestoDAO.findFirstLetters();
		} else {
			return mjestoDAO.findFirstLettersByObjekti();
		}
	}

	@Factory("mjesta")
	public javax.faces.model.DataModel getMjesta() {
		List<Mjesto> tmpList;
		if (page == null) {
			page = 1;
		}
		tmpList = mjestoDAO.findByFirstLetter(letter, page * 15 - 15, 15);
		return new PagedListDataModel(tmpList, mjestoDAO.findCountByFirstLetter(letter), 15);
	}

	public javax.faces.model.DataModel getMjesta(final String letter) {
		List<Mjesto> tmpList;
		if (identity.hasRole(Role.ADMIN.toString())) {
			tmpList = mjestoDAO.findByFirstLetter(letter);
		} else {
			tmpList = mjestoDAO.findByFirstLetterObjOpObjJezik(letter,
					currentLang, page * 15 - 15, 15);
		}

		return new PagedListDataModel(tmpList, mjestoDAO
				.findCountByFirstLetterObjOpObjJezik(letter, currentLang), 15);
	}

	@Factory("mjestaByObjekti")
	public List<Mjesto> getMjestaByObjekti() {
		final List<Mjesto> mjesta = mjestoDAO.findByObjekti();
		Collections.sort(mjesta, new Comparator<Mjesto>() {

			@Override
			public int compare(final Mjesto arg0, final Mjesto arg1) {
				return arg0.getNaziv().compareTo(arg1.getNaziv());
			}

		});
		for (int i = 0; i < mjesta.size(); i++) {
			if (i < mjesta.size() - 1
					&& mjesta.get(i).getNaziv().equals(
							mjesta.get(i + 1).getNaziv())) {
				final String naziv = mjesta.get(i).getNaziv();
				while (mjesta.get(i).getNaziv().equals(naziv)) {
					final Mjesto newMj = new Mjesto();
					newMj.setIdMjesta(mjesta.get(i).getIdMjesta());
					newMj.setNaziv(mjesta.get(i).getNaziv() + ", "
							+ mjesta.get(i).getZupanija().getNaziv());
					mjesta.set(i, newMj);
					i++;
				}
			}
		}
		return mjesta;
	}

	@Factory("idMjestaByObjekti")
	public List<SelectItem> getIdMjestaByObjekti() {
		final List<SelectItem> sil = new ArrayList<SelectItem>();
		final List<Mjesto> mjesta = mjestoDAO.findByObjekti();
		// sil.add(new SelectItem("", ""));
		for (final Mjesto mjesto : mjesta) {
			sil.add(new SelectItem(mjesto.getIdMjesta(), mjesto.getNaziv()));
		}
		return sil;
	}
}
